1Writer 終了予定時刻ビュー (翌日以降)
code:js
let noteText = editor.getText();
// 未完了タスクおよび🗂️で始まる行を正規表現で抽出
let tasks = noteText.match(/- \ \(?: (\d{2}:\d{2})-)?(?: \\(\d+))?(.*)|🗂️.*/g);
if (tasks) {
// 結果を格納するリスト
let endTimes = [];
let currentDateTime = new Date(); // 0時0分を基準にする
currentDateTime.setHours(0, 0, 0, 0);
let lastEndTime = ''; // 最後のタスクの終了時刻を保持する変数
tasks.forEach((task, index) => {
// 🗂️で始まる行を処理
if (task.startsWith("🗂️")) {
endTimes.push(task); // タスク名をそのままリストに追加
return; // 次のループへ
}
// タスクから開始時刻、所要時間、タスク名を抽出
let match = task.match(/- \ \(?: (\d{2}:\d{2})-)?(?: \\(\d+))?(.*)/);
let startTime = match1; // 開始時刻 (optional)
let duration = match2 ? parseInt(match2, 10) : 0; // 所要時間 (デフォルトで0)
let taskName = match3.trim(); // タスク名
let baseTime;
let actualStartTime;
let scheduleTimeWarning = '';
// 一つ目のタスクの処理
if (index === 0 || !endTimesendTimes.length - 1.startsWith("終了予定時刻")) {
if (startTime) {
// 開始時刻が指定されている場合
let hours, minutes = startTime.split(':').map(Number);
baseTime = new Date();
baseTime.setHours(hours);
baseTime.setMinutes(minutes);
baseTime.setSeconds(0);
baseTime.setMilliseconds(0);
} else {
// 開始時刻がない場合、現在時刻を基準にする
baseTime = new Date(currentDateTime);
}
} else {
// 2つ目以降のタスクは、前のタスクの終了予定時刻を基準にする
baseTime = new Date(currentDateTime);
}
// 基準時刻に所要時間を追加して終了時刻を計算
actualStartTime = new Date(baseTime); // 実際の開始時刻
let endDate = new Date(baseTime.getTime() + duration * 60000);
// スケジュール時間のチェックと警告の設定
let scheduleTimeMatch = taskName.match(/@(\d{2}:\d{2})/);
if (scheduleTimeMatch) {
let schedHours, schedMinutes = scheduleTimeMatch1.split(':').map(Number);
let scheduleTime = new Date();
scheduleTime.setHours(schedHours);
scheduleTime.setMinutes(schedMinutes);
scheduleTime.setSeconds(0);
scheduleTime.setMilliseconds(0);
// 開始予定時刻がスケジュールされた時間より後なら警告をつける
if (actualStartTime > scheduleTime) {
scheduleTimeWarning = '⚠️';
}
}
// "HH:MM"形式にフォーマット
let startTimeStr = actualStartTime.toTimeString().slice(0, 5);
let endTimeStr = endDate.toTimeString().slice(0, 5);
// 最後のタスクの終了時刻を更新
lastEndTime = endTimeStr;
// 残り時間の計算(現在時刻 - 開始時刻)
let elapsedTime = Math.ceil((new Date() - actualStartTime) / 60000);
// 超過時間のチェック
let remainingTimeInfo = '';
if (elapsedTime > duration) {
let overdueMinutes = elapsedTime - duration;
remainingTimeInfo = ⚠️超過${overdueMinutes}分;
} else if (duration > 0) {
let remainingTime = duration - elapsedTime;
remainingTimeInfo = ➡️残り${remainingTime}分;
} else {
remainingTimeInfo = '🕒残り時間なし';
}
// 結果を「タスク名: 開始時刻 - 終了予定時刻 (見積時間分)」の形式でリストに追加
let taskOutput = ${taskName}||${scheduleTimeWarning}${startTimeStr} - ${endTimeStr} (${duration}分);
if (startTime) {
taskOutput += ${remainingTimeInfo};
}
endTimes.push(taskOutput);
// 次のタスクの基準時刻として設定
currentDateTime = endDate;
});
// 結果をリスト形式で表示 (最後のタスクの終了時刻をタイトルに使用)
ui.list(終了時刻: ${lastEndTime}, endTimes);
} else {
ui.alert("未完了タスクが見つかりませんでした。");
}